// 'use strict';
// require: .js/.json/.node
// .js -> module.exports/exports
// .json -> JSON.parse
//.node -> c++ process.d
// any-> .js
module.exports = core;
const path = require('path')
// 比对版本号
const semver = require('semver')
// 颜色插件
const colors = require('colors/safe')
// 获取用户主目录
const userHome = require('user-home')
// 检查路径是否存在
const pathExists = require('path-exists').sync
const commander = require('commander')
// 解析参数选项
const minimist = require('minimist')
let args = minimist(process.argv.slice(2))
// npmlog再封装
const log = require('@imooc-cli-dev-dq/log')
const init = require('@imooc-cli-dev-dq/init')
const exec = require('@imooc-cli-dev-dq/exec')
const pkg = require('../package.json')
const constant = require('./const')
const program = new commander.Command()
let config = ''
async function core() {
    // TODO
    try {
        console.log('启动core')
        // 脚手架启动阶段
        prepare()
        // 命令注册
        registerCommand()
    } catch (e) {
        log.error(e.message)
        if (process.env.LOG_LEVEL === 'verbose'){
            console.log(e)
        }
    }
}
// 脚手架启动阶段
async function prepare() {
    // 查看当前版本号
    checkPkgVersion()
    // 检查node版本号
    // checkNodeVersion()
    // 检查root启动，并降级处理
    checkRoot()
    // 检查node版本号
    checkUserName()
    // checkInputArgs()
    // 检查环境变量
    checkEnv()
    // 检查cli最新版本
    await checkGlobalUpdate()
    
}
 // 命令注册
function registerCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '')

    // program
    //     .command('init [projectName]')
    //     .option('-f, --force', '是否强制初始化项目')
    //     .action(init)
    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化项目')
        .action(exec)
    // 开启debug模式
    program.on('option:debug', function() {
        if (program.opts().debug) {
            process.env.LOG_LEVEL = 'verbose' 
        } else {
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL
        log.verbose('test')
    })
        // 指定targetPath
        
    program.on('option:targetPath', function() {
        process.env.CLI_TARGET_PATH = program.opts().targetPath
    })
    // 对未知命令监听
    program.on('command:*', function(obj) {

        const  availableCommands = program.commands.map(cmd => cmd.name())
        console.log(colors.red('未知的命令：', obj[0]))
        if (availableCommands.length > 0) {
            console.log(colors.red('可用命令：', availableCommands.join(',')))
        }
    })

    if (program.args && program.args.length < 1) {
        // program.outputHelp()
    }
    // console.log(program)
    program.parse(process.argv)

}

// 检查cli最新版本
async function checkGlobalUpdate() {
    // 1.获取当前版本号和模块名
    const currentVersion = pkg.version
    const npmName = pkg.name
    // 2.调用npm Api,获取所有版本号
    // 3.提取所有版本号，比对那些版本号大于当前版本号
    // 4.获取最新版本号，提示用户更新到该版本
    const {getNpmSemverVersion} = require('@imooc-cli-dev-dq/get-npm-info')
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName)
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn(colors.yellow(`请手动更新${npmName}, 当前版本： ${currentVersion}, 最新版本：${lastVersion}
        可使用命令: npm i -g ${npmName} 更新
        `))
    }
}
// 检查环境变量
function checkEnv() {
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome, '.env')
    if (pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        })
    } 
    createDefaultConfig()
    log.verbose('环境变量', process.env.CLI_HOME_PATH)
}

function createDefaultConfig() {
    const cliConfig = {
        home: userHome
    }
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME)

    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
    // return cliConfig
}

// 入参检查
function checkInputArgs() {
    const args = minimist(process.argv.slice(2))
    checkArgs()
}

function checkArgs() {
  if (args.debug) {
      process.env.LOG_LEVEL = 'verbose'
    } else {
      process.env.LOG_LEVEL = 'info'
  }
  log.level = process.env.LOG_LEVEL
}
// 检查用户主目录
function checkUserName() {
    if(!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录主目录不存在！'))
    }
}

// 检查node版本号
function checkNodeVersion() {
    // 获取node当前版本号
    const currentVersion = process.version
    // 大于最低版本号
    const lowestVersion = constant.LOWEST_NODE_VERSION
    if (!semver.gte(currentVersion, lowestVersion)) {
        throw new Error(colors.red(`imooc-cli-dq 需要安装 v${lowestVersion}版本以上node.js`))
    } else {
        // log.success('node', currentVersion)
    }
}

// 查看当前版本号
function checkPkgVersion() {
    log.notice('cli', pkg.version)
}

// 检查root启动，并降级处理
function checkRoot() {
    // 对root 降级
    const rootCheck = require('root-check')
    rootCheck()
    // const uid = process.geteuid()
    // console.log(uid)
}
